#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
自动发布脚本 - Undershot Versions Updater
自动更新版本号并推送到Git仓库
"""

import os
import sys
import subprocess
import shutil
from datetime import datetime
import json

class AutoReleaseScript:
    def __init__(self):
        self.repo_path = r"F:\Deskto\汉化、技术用\About UNDERSHOT\us install\undershot_versions_updater"
        self.config_file = "config.txt"
        self.changelog_file = "更新日志.txt"
        self.patches_file = "patches.xdelta"
        
        # 版本配置
        self.current_version = "0012b"
        self.new_version = "0013"
        self.app_version = "v2.1.2"
        
    def print_header(self):
        """打印脚本标题"""
        print("=" * 60)
        print("🚀 Undershot Versions Updater - 自动发布脚本")
        print("=" * 60)
        print()
    
    def check_git_status(self):
        """检查Git状态和仓库路径"""
        print("📂 检查仓库状态...")
        
        if not os.path.exists(self.repo_path):
            print(f"❌ 错误：仓库路径不存在: {self.repo_path}")
            return False
            
        try:
            os.chdir(self.repo_path)
            result = subprocess.run(['git', 'status', '--porcelain'], 
                                  capture_output=True, text=True, check=True)
            
            if result.stdout.strip():
                print("⚠️  检测到未提交的更改:")
                print(result.stdout)
                choice = input("是否继续? (y/n): ").lower().strip()
                if choice != 'y':
                    return False
            else:
                print("✅ Git状态正常")
                
            return True
            
        except subprocess.CalledProcessError as e:
            print(f"❌ Git命令执行失败: {e}")
            return False
        except Exception as e:
            print(f"❌ 检查Git状态时出错: {e}")
            return False
    
    def get_user_input(self):
        """获取用户输入的版本信息"""
        print("\n📝 配置新版本信息:")
        print("-" * 30)
        
        # 读取当前配置
        self.read_current_config()
        
        print(f"当前版本: {self.current_version}")
        new_version = input(f"输入新版本号 (默认: {self.new_version}): ").strip()
        if new_version:
            self.new_version = new_version
            
        new_app_version = input(f"输入应用版本 (默认: {self.app_version}): ").strip()
        if new_app_version:
            self.app_version = new_app_version
            
        print(f"\n✅ 版本配置:")
        print(f"   当前版本: {self.current_version}")
        print(f"   新版本: {self.new_version}")
        print(f"   应用版本: {self.app_version}")
        
        choice = input("\n确认版本信息? (y/n): ").lower().strip()
        return choice == 'y'
    
    def read_current_config(self):
        """读取当前配置文件"""
        config_path = os.path.join(self.repo_path, self.config_file)
        if os.path.exists(config_path):
            try:
                with open(config_path, 'r', encoding='utf-8') as f:
                    for line in f:
                        line = line.strip()
                        if line.startswith('current_version='):
                            self.current_version = line.split('=', 1)[1]
                        elif line.startswith('app_version='):
                            self.app_version = line.split('=', 1)[1]
            except Exception as e:
                print(f"⚠️  读取配置文件时出错: {e}")
    
    def update_config_file(self):
        """更新配置文件"""
        print("\n📝 更新配置文件...")
        
        config_path = os.path.join(self.repo_path, self.config_file)
        config_content = f"""current_version={self.current_version}
latest_version={self.new_version}
app_version={self.app_version}
"""
        
        try:
            with open(config_path, 'w', encoding='utf-8') as f:
                f.write(config_content)
            print(f"✅ 配置文件已更新: {config_path}")
            return True
        except Exception as e:
            print(f"❌ 更新配置文件失败: {e}")
            return False
    
    def check_patches_file(self):
        """检查补丁文件是否存在"""
        print("\n🔍 检查补丁文件...")
        
        patches_path = os.path.join(self.repo_path, self.patches_file)
        
        if not os.path.exists(patches_path):
            print(f"⚠️  补丁文件不存在: {patches_path}")
            choice = input("是否继续发布? (y/n): ").lower().strip()
            if choice != 'y':
                return False
            print("⚠️  将在没有补丁文件的情况下发布")
        else:
            file_size = os.path.getsize(patches_path)
            print(f"✅ 补丁文件存在: {patches_path} ({file_size} bytes)")
        
        return True
    
    def check_changelog_file(self):
        """检查更新日志文件是否存在"""
        print("\n🔍 检查更新日志文件...")
        
        changelog_path = os.path.join(self.repo_path, self.changelog_file)
        
        if not os.path.exists(changelog_path):
            print(f"⚠️  更新日志文件不存在: {changelog_path}")
            choice = input("是否继续发布? (y/n): ").lower().strip()
            if choice != 'y':
                return False
            print("⚠️  将在没有更新日志文件的情况下发布")
        else:
            file_size = os.path.getsize(changelog_path)
            print(f"✅ 更新日志文件存在: {changelog_path} ({file_size} bytes)")
        
        return True
    
    def git_add_commit_push(self):
        """执行Git操作：清空仓库并推送全新内容"""
        print("\n🔄 执行Git操作...")
        print(f"📂 当前工作目录: {os.getcwd()}")
        
        try:
            # 检查Git仓库状态
            print("🔍 检查Git仓库...")
            result = subprocess.run(['git', 'status'], capture_output=True, text=True, check=True)
            print("Git状态:")
            print(result.stdout)
            
            # 检查远程仓库配置
            print("🔗 检查远程仓库配置...")
            remote_result = subprocess.run(['git', 'remote', '-v'], 
                                         capture_output=True, text=True, check=True)
            print("远程仓库:")
            print(remote_result.stdout)
            
            # 检查当前分支
            print("🌿 检查当前分支...")
            branch_result = subprocess.run(['git', 'branch', '--show-current'], 
                                         capture_output=True, text=True, check=True)
            current_branch = branch_result.stdout.strip()
            target_branch = current_branch if current_branch else 'master'
            print(f"当前分支: {target_branch}")
            
            # 第一步：创建一个全新的孤儿分支（清空历史）
            print("🗑️  创建全新的孤儿分支...")
            temp_branch = f"temp-clean-{datetime.now().strftime('%Y%m%d%H%M%S')}"
            subprocess.run(['git', 'checkout', '--orphan', temp_branch], 
                          capture_output=True, text=True, check=True)
            print(f"✅ 创建临时分支: {temp_branch}")
            
            # 第二步：清空所有已跟踪的文件
            print("🧹 清空Git索引...")
            subprocess.run(['git', 'rm', '-rf', '--cached', '.'], 
                          capture_output=True, text=True, check=False)  # 可能会失败，不检查
            
            # 第三步：添加当前所有文件
            print("📎 添加所有当前文件...")
            add_result = subprocess.run(['git', 'add', '.'], capture_output=True, text=True, check=True)
            print("✅ 文件添加成功")
            
            # 检查准备提交的文件
            print("📋 检查准备提交的文件...")
            staged_result = subprocess.run(['git', 'diff', '--cached', '--name-only'], 
                                         capture_output=True, text=True, check=True)
            if staged_result.stdout.strip():
                print("准备提交的文件:")
                for file in staged_result.stdout.strip().split('\n'):
                    print(f"  - {file}")
            else:
                print("⚠️  没有文件在暂存区")
            
            # 第四步：创建全新的初始提交
            commit_message = f"Release {self.new_version}: 全新发布版本"
            print(f"💾 创建全新提交: {commit_message}")
            commit_result = subprocess.run(['git', 'commit', '-m', commit_message], 
                                         capture_output=True, text=True, check=True)
            print("✅ 提交成功!")
            if commit_result.stdout:
                print("提交输出:", commit_result.stdout)
            
            # 第五步：删除原有分支并重命名临时分支
            print(f"🔄 替换原分支 {target_branch}...")
            subprocess.run(['git', 'branch', '-D', target_branch], 
                          capture_output=True, text=True, check=False)  # 可能会失败，不检查
            subprocess.run(['git', 'branch', '-m', temp_branch, target_branch], 
                          capture_output=True, text=True, check=True)
            print(f"✅ 分支替换成功: {target_branch}")
            
            # 第六步：强制推送，完全覆盖远程仓库
            print(f"🚀 强制推送全新内容到远程仓库 (分支: {target_branch})...")
            print("⚠️  注意：这将完全清空并覆盖远程仓库的所有内容和历史！")
            
            force_push_command = ['git', 'push', 'origin', target_branch, '--force']
            push_result = subprocess.run(force_push_command, capture_output=True, text=True, check=True)
            
            print("✅ 远程仓库已完全更新!")
            print("📋 远程仓库现在包含全新的干净内容")
            if push_result.stdout:
                print("推送输出:", push_result.stdout)
            if push_result.stderr:
                print("推送信息:", push_result.stderr)
                
            return True
            
        except subprocess.CalledProcessError as e:
            print(f"❌ Git操作失败: {e}")
            print(f"❌ 返回码: {e.returncode}")
            if e.stdout:
                print("标准输出:", e.stdout)
            if e.stderr:
                print("错误输出:", e.stderr)
            
            # 尝试恢复到原分支
            try:
                print("🔄 尝试恢复到原分支...")
                subprocess.run(['git', 'checkout', target_branch], 
                              capture_output=True, text=True, check=False)
            except:
                pass
                
            return False
        except Exception as e:
            print(f"❌ 执行Git操作时出错: {e}")
            return False
    
    def verify_release(self):
        """验证发布结果"""
        print("\n🔍 验证发布结果...")
        
        repo_url = "https://gitee.com/wasneetpotato/undershot_versions_updater"
        print(f"📋 请手动验证以下文件是否正确上传:")
        print(f"   🌐 仓库地址: {repo_url}")
        print(f"   📄 config.txt - latest_version应为: {self.new_version}")
        print(f"   📋 更新日志.txt - 应包含版本信息")
        print(f"   📦 patches.xdelta - 补丁文件")
        
        print(f"\n🎉 版本 {self.new_version} 发布完成!")
        print("💡 用户下次启动程序时将收到更新提示")
    
    def run(self):
        """运行主流程"""
        try:
            self.print_header()
            
            # 检查Git状态
            if not self.check_git_status():
                return False
            
            # 获取用户输入
            if not self.get_user_input():
                print("❌ 用户取消操作")
                return False
            
            # 更新配置文件
            if not self.update_config_file():
                return False
            
            # 检查更新日志文件
            if not self.check_changelog_file():
                return False
            
            # 检查补丁文件
            if not self.check_patches_file():
                return False
            
            # 最终确认
            print("\n" + "=" * 40)
            print("🔍 发布前最终检查:")
            print(f"   📂 仓库路径: {self.repo_path}")
            print(f"   🏷️  新版本: {self.new_version}")
            print(f"   📱 应用版本: {self.app_version}")
            print("=" * 40)
            
            final_confirm = input("确认发布? (y/n): ").lower().strip()
            if final_confirm != 'y':
                print("❌ 用户取消发布")
                return False
            
            # 执行Git操作
            if not self.git_add_commit_push():
                return False
            
            # 验证结果
            self.verify_release()
            
            return True
            
        except KeyboardInterrupt:
            print("\n❌ 用户中断操作")
            return False
        except Exception as e:
            print(f"❌ 脚本执行出错: {e}")
            return False

def main():
    """主函数"""
    script = AutoReleaseScript()
    
    if script.run():
        print("\n🎉 脚本执行成功!")
        return 0
    else:
        print("\n❌ 脚本执行失败!")
        return 1

if __name__ == "__main__":
    sys.exit(main())